Specify the tissue of interest, run the boilerplate code which sets up the functions and environment, load the tissue object.

tissue_of_interest = "Thymus"
library(here)
source(here("00_data_ingest", "02_tissue_analysis_rmd", "boilerplate.R"))
tiss <- load_tissue_droplet(tissue_of_interest)
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
|----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data matrix"

  |                                                                                                      
  |                                                                                                |   0%
  |                                                                                                      
  |================================================================================================| 100%
Calculating gene means
0%   10   20   30   40   50   60   70   80   90   100%
|----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variance to mean ratios
0%   10   20   30   40   50   60   70   80   90   100%
|----|----|----|----|----|----|----|----|----|----|
**************************************************|

PCElbowPlot(object = tiss)

# Set number of principal components. 
n.pcs = 10
# Set resolution 
res.used <- 0.5
tiss <- FindClusters(object = tiss, reduction.type = "pca", dims.use = 1:n.pcs, 
    resolution = res.used, print.output = 0, save.SNN = TRUE)
tiss <- RunTSNE(object = tiss, dims.use = 1:n.pcs, seed.use = 10, perplexity=30)
# note that you can set do.label=T to help label individual clusters
TSNEPlot(object = tiss, do.label = T)

# Batch and animal effects
TSNEPlot(object = tiss, do.return = TRUE, group.by = "plate.barcode")
Error in FetchData(object = object, vars.all = group.by) : 
  Error: plate.barcode not found

Check expression of genes of interset.

Dotplots let you see the intensity of expression and the fraction of cells expressing for each of your genes of interest.

VlnPlot(tiss, "Cd3g")

VlnPlot(tiss, "Krt5") #stromal marker

VlnPlot(tiss, "Vim") #stromal marker, also mesenchymal

VlnPlot(tiss, "Pecam1") #fibroblasts

VlnPlot(tiss, "Pecam1") #fibroblasts

GenePlot(tiss, "Cd3d", "Vim")

How big are the clusters?

table(tiss@ident)

  0   1   2   3   4   5   6   7   8 
334 283 227 219 187  71  44  33  31 

Which markers identify a specific cluster?

#clust.markers <- FindMarkers(object = tiss, ident.1 = 3, only.pos = TRUE, min.pct = 0.25, thresh.use = 0.25)
#print(x = head(x= clust.markers, n = 10))

Assigning cell type identity to clusters

At a coarse level, we can use canonical markers to match the unbiased clustering to known cell types:

free_annotation <- c("DN4-DP in transition Cd69_negative thymocytes",
                     "DN4-DP transition_Cd69_negative_rapidly dividing thymocytes",
                     "DN4-DP transition_Cd69_low thymocytes",
                     "DN4-DP in transition_Cd69_negative_rapidly dividing thymocytes",
                     "DN4-DP in transition Cd69_positive thymocytes", 
                     "DN4-DP in transition Cd69_negative_thymocytes",
                     "DN1 thymocytes",
                     "DN3-DN4 thymocytes",
                     "antigen presenting cells")
cell_ontology_class <-c("immature T cell", "immature T cell","immature T cell","immature T cell","immature T cell","DN1 thymic pro-T cell","immature T cell", "professional antigen presenting cell")
tiss@meta.data[,'free_annotation'] <- plyr::mapvalues(x = tiss@meta.data$cluster.ids, from = cluster.ids, to = free_annotation)
stash_annotations(tiss, cluster.ids, free_annotation, cell_ontology_class)
Error in plyr::mapvalues(x = tiss@ident, from = cluster.ids, to = cell_ontology_class) : 
  `from` and `to` vectors are not the same length.
TSNEPlot(object = tiss, do.label = TRUE, pt.size = 0.5, group.by='free_annotation')
ggsave ("TSNE_thymus2.pdf")
Saving 7.29 x 4.51 in image

Save the Robject for later

When you save the annotated tissue, please give it a name.

filename = here('00_data_ingest', '04_tissue_robj_generated', 
                     paste0("droplet_", tissue_of_interest, "_seurat_tiss.Robj"))
print(filename)
[1] "/Users/patricia/Documents/GitHub/tabula-muris/00_data_ingest/04_tissue_robj_generated/droplet_Thymus_seurat_tiss.Robj"
save(tiss, file=filename)
# To reload a saved object
# filename = here('00_data_ingest', '04_tissue_robj_generated', 
#                      paste0("facs", tissue_of_interest, "_seurat_tiss.Robj"))
# load(file=filename)

Export the final metadata

So that Biohub can easily combine all your cell_ontology_classs, please export them as a simple csv.

head(tiss@meta.data)
filename = here('00_data_ingest', '03_tissue_annotation_csv', 
                     paste0(tissue_of_interest, "_droplet", "_annotation.csv"))
write.csv(FetchData(tiss, c('plate.barcode','cell_ontology_class','cell_ontology_id', 'free_annotation', 'tSNE_1', 'tSNE_2')), file=filename)
Error in FetchData(tiss, c("plate.barcode", "cell_ontology_class", "cell_ontology_id",  : 
  Error: plate.barcode not found

Figures for Supplement

LS0tCnRpdGxlOiAiVGh5bXVzIGRyb3BsZXQgTm90ZWJvb2siCm91dHB1dDoKICBodG1sX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAotLS0KClNwZWNpZnkgdGhlIHRpc3N1ZSBvZiBpbnRlcmVzdCwgcnVuIHRoZSBib2lsZXJwbGF0ZSBjb2RlIHdoaWNoIHNldHMgdXAgdGhlIGZ1bmN0aW9ucyBhbmQgZW52aXJvbm1lbnQsIGxvYWQgdGhlIHRpc3N1ZSBvYmplY3QuCgpgYGB7cn0KdGlzc3VlX29mX2ludGVyZXN0ID0gIlRoeW11cyIKbGlicmFyeShoZXJlKQpzb3VyY2UoaGVyZSgiMDBfZGF0YV9pbmdlc3QiLCAiMDJfdGlzc3VlX2FuYWx5c2lzX3JtZCIsICJib2lsZXJwbGF0ZS5SIikpCnRpc3MgPC0gbG9hZF90aXNzdWVfZHJvcGxldCh0aXNzdWVfb2ZfaW50ZXJlc3QpCmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTh9ClBDSGVhdG1hcChvYmplY3QgPSB0aXNzLCBwYy51c2UgPSAxOjMsIGNlbGxzLnVzZSA9IDUwMCwgZG8uYmFsYW5jZWQgPSBUUlVFLCBsYWJlbC5jb2x1bW5zID0gRkFMU0UsIG51bS5nZW5lcyA9IDgpCmBgYAoKCgpgYGB7cn0KUENFbGJvd1Bsb3Qob2JqZWN0ID0gdGlzcykKYGBgCgpgYGB7cn0KIyBTZXQgbnVtYmVyIG9mIHByaW5jaXBhbCBjb21wb25lbnRzLiAKbi5wY3MgPSAxMApgYGAKCmBgYHtyfQojIFNldCByZXNvbHV0aW9uIApyZXMudXNlZCA8LSAwLjUKCnRpc3MgPC0gRmluZENsdXN0ZXJzKG9iamVjdCA9IHRpc3MsIHJlZHVjdGlvbi50eXBlID0gInBjYSIsIGRpbXMudXNlID0gMTpuLnBjcywgCiAgICByZXNvbHV0aW9uID0gcmVzLnVzZWQsIHByaW50Lm91dHB1dCA9IDAsIHNhdmUuU05OID0gVFJVRSkKYGBgCgpgYGB7cn0KdGlzcyA8LSBSdW5UU05FKG9iamVjdCA9IHRpc3MsIGRpbXMudXNlID0gMTpuLnBjcywgc2VlZC51c2UgPSAxMCwgcGVycGxleGl0eT0zMCkKYGBgCgpgYGB7cn0KIyBub3RlIHRoYXQgeW91IGNhbiBzZXQgZG8ubGFiZWw9VCB0byBoZWxwIGxhYmVsIGluZGl2aWR1YWwgY2x1c3RlcnMKVFNORVBsb3Qob2JqZWN0ID0gdGlzcywgZG8ubGFiZWwgPSBUKQpgYGAKCmBgYHtyfQojIEJhdGNoIGFuZCBhbmltYWwgZWZmZWN0cwpUU05FUGxvdChvYmplY3QgPSB0aXNzLCBkby5yZXR1cm4gPSBUUlVFLCBncm91cC5ieSA9ICJwbGF0ZS5iYXJjb2RlIikKVFNORVBsb3Qob2JqZWN0ID0gdGlzcywgZG8ucmV0dXJuID0gVFJVRSwgZ3JvdXAuYnkgPSAibW91c2UuaWQiKQpgYGAKCkNoZWNrIGV4cHJlc3Npb24gb2YgZ2VuZXMgb2YgaW50ZXJzZXQuCgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9CmdlbmVzX3RvX2NoZWNrID0gYygnVmltJywnS3J0NScsJ0tydDgnLCdQdHByYycsJ0VwY2FtJywnSDItQWIxJywnSDItQWEnLCdDZDNlJywnQ2QzZCcsJ0NkM2cnLCdDZDQnLCdDZDhhJywnQ2Q4YjEnLCdFdHMxJywnQ2Q0NCcsJ0lsMnJhJywgJ1RvcDJhJywnQ2Q4NicsJ0NkMTQnLCdDZDE5JywnSXRnYXgnLCdEbnR0JywnUmFnMScsJ1JhZzInLCdQdGNyYScsJ01raTY3JywnQ2Q2OScsJ0NkMjcnKQpGZWF0dXJlUGxvdCh0aXNzLCBnZW5lc190b19jaGVjaywgcHQuc2l6ZSA9IDEsIG5Db2wgPSAzKQpgYGAKCkRvdHBsb3RzIGxldCB5b3Ugc2VlIHRoZSBpbnRlbnNpdHkgb2YgZXhwcmVzc2lvbiBhbmQgdGhlIGZyYWN0aW9uIG9mIGNlbGxzIGV4cHJlc3NpbmcgZm9yIGVhY2ggb2YgeW91ciBnZW5lcyBvZiBpbnRlcmVzdC4KCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD04fQojIFRvIGNoYW5nZSB0aGUgeS1heGlzIHRvIHNob3cgcmF3IGNvdW50cywgYWRkIHVzZS5yYXcgPSBULgojRG90UGxvdCh0aXNzLCBnZW5lc190b19jaGVjaywgY29sLm1heCA9IDIuNSwgcGxvdC5sZWdlbmQgPSBULCBkby5yZXR1cm4gPSBUKSArIGNvb3JkX2ZsaXAoKQpWbG5QbG90KHRpc3MsIGdlbmVzX3RvX2NoZWNrKQpgYGAKCmBgYHtyfQpWbG5QbG90KHRpc3MsICJDZDNnIikKVmxuUGxvdCh0aXNzLCAiS3J0NSIpICNzdHJvbWFsIG1hcmtlcgpWbG5QbG90KHRpc3MsICJWaW0iKSAjc3Ryb21hbCBtYXJrZXIsIGFsc28gbWVzZW5jaHltYWwKVmxuUGxvdCh0aXNzLCAiUGVjYW0xIikgI2ZpYnJvYmxhc3RzClZsblBsb3QodGlzcywgIlBlY2FtMSIpICNmaWJyb2JsYXN0cwoKR2VuZVBsb3QodGlzcywgIkNkM2QiLCAiVmltIikKYGBgCgoKSG93IGJpZyBhcmUgdGhlIGNsdXN0ZXJzPwpgYGB7cn0KdGFibGUodGlzc0BpZGVudCkKYGBgCgpXaGljaCBtYXJrZXJzIGlkZW50aWZ5IGEgc3BlY2lmaWMgY2x1c3Rlcj8KYGBge3J9CiNjbHVzdC5tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHRpc3MsIGlkZW50LjEgPSAzLCBvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjI1LCB0aHJlc2gudXNlID0gMC4yNSkKI3ByaW50KHggPSBoZWFkKHg9IGNsdXN0Lm1hcmtlcnMsIG4gPSAxMCkpCmBgYAoKIyMgQXNzaWduaW5nIGNlbGwgdHlwZSBpZGVudGl0eSB0byBjbHVzdGVycwoKQXQgYSBjb2Fyc2UgbGV2ZWwsIHdlIGNhbiB1c2UgY2Fub25pY2FsIG1hcmtlcnMgdG8gbWF0Y2ggdGhlIHVuYmlhc2VkIGNsdXN0ZXJpbmcgdG8ga25vd24gY2VsbCB0eXBlczoKCmBgYHtyfQojIHN0YXNoIGN1cnJlbnQgY2x1c3RlciBJRHMKdGlzcyA8LSBTdGFzaElkZW50KG9iamVjdCA9IHRpc3MsIHNhdmUubmFtZSA9ICJjbHVzdGVyLmlkcyIpCgojIGVudW1lcmF0ZSBjdXJyZW50IGNsdXN0ZXIgSURzIGFuZCB0aGUgbGFiZWxzIGZvciB0aGVtCmNsdXN0ZXIuaWRzIDwtIGMoMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCkKZnJlZV9hbm5vdGF0aW9uIDwtIGMoIkRONC1EUCBpbiB0cmFuc2l0aW9uIENkNjlfbmVnYXRpdmUgdGh5bW9jeXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICJETjQtRFAgdHJhbnNpdGlvbl9DZDY5X25lZ2F0aXZlX3JhcGlkbHkgZGl2aWRpbmcgdGh5bW9jeXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICJETjQtRFAgdHJhbnNpdGlvbl9DZDY5X2xvdyB0aHltb2N5dGVzIiwKICAgICAgICAgICAgICAgICAgICAgIkRONC1EUCBpbiB0cmFuc2l0aW9uX0NkNjlfbmVnYXRpdmVfcmFwaWRseSBkaXZpZGluZyB0aHltb2N5dGVzIiwKICAgICAgICAgICAgICAgICAgICAgIkRONC1EUCBpbiB0cmFuc2l0aW9uX0NkNjlfcG9zaXRpdmUgdGh5bW9jeXRlcyIsIAogICAgICAgICAgICAgICAgICAgICAiRE40LURQIGluIHRyYW5zaXRpb25fQ2Q2OV9uZWdhdGl2ZV90aHltb2N5dGVzIiwKICAgICAgICAgICAgICAgICAgICAgIkROMSB0aHltb2N5dGVzIiwKICAgICAgICAgICAgICAgICAgICAgIkROMy1ETjQgdGh5bW9jeXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICJhbnRpZ2VuIHByZXNlbnRpbmcgY2VsbHMiKQoKY2VsbF9vbnRvbG9neV9jbGFzcyA8LWMoImltbWF0dXJlIFQgY2VsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpbW1hdHVyZSBUIGNlbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAiaW1tYXR1cmUgVCBjZWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImltbWF0dXJlIFQgY2VsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpbW1hdHVyZSBUIGNlbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAiaW1tYXR1cmUgVCBjZWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgIkROMSB0aHltaWMgcHJvLVQgY2VsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpbW1hdHVyZSBUIGNlbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvZmVzc2lvbmFsIGFudGlnZW4gcHJlc2VudGluZyBjZWxsIikKCnRpc3NAbWV0YS5kYXRhWywnZnJlZV9hbm5vdGF0aW9uJ10gPC0gcGx5cjo6bWFwdmFsdWVzKHggPSB0aXNzQG1ldGEuZGF0YSRjbHVzdGVyLmlkcywgZnJvbSA9IGNsdXN0ZXIuaWRzLCB0byA9IGZyZWVfYW5ub3RhdGlvbikKCnN0YXNoX2Fubm90YXRpb25zKHRpc3MsIGNsdXN0ZXIuaWRzLCBmcmVlX2Fubm90YXRpb24sIGNlbGxfb250b2xvZ3lfY2xhc3MpCmBgYAoKYGBge3J9CgpUU05FUGxvdChvYmplY3QgPSB0aXNzLCBkby5sYWJlbCA9IFRSVUUsIHB0LnNpemUgPSAwLjUsIGdyb3VwLmJ5PSdmcmVlX2Fubm90YXRpb24nKQpnZ3NhdmUgKCJUU05FX3RoeW11czIucGRmIikKYGBgCgojIFNhdmUgdGhlIFJvYmplY3QgZm9yIGxhdGVyCldoZW4geW91IHNhdmUgdGhlIGFubm90YXRlZCB0aXNzdWUsIHBsZWFzZSBnaXZlIGl0IGEgbmFtZS4KCmBgYHtyfQpmaWxlbmFtZSA9IGhlcmUoJzAwX2RhdGFfaW5nZXN0JywgJzA0X3Rpc3N1ZV9yb2JqX2dlbmVyYXRlZCcsIAogICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoImRyb3BsZXRfIiwgdGlzc3VlX29mX2ludGVyZXN0LCAiX3NldXJhdF90aXNzLlJvYmoiKSkKcHJpbnQoZmlsZW5hbWUpCnNhdmUodGlzcywgZmlsZT1maWxlbmFtZSkKYGBgCgpgYGB7cn0KIyBUbyByZWxvYWQgYSBzYXZlZCBvYmplY3QKIyBmaWxlbmFtZSA9IGhlcmUoJzAwX2RhdGFfaW5nZXN0JywgJzA0X3Rpc3N1ZV9yb2JqX2dlbmVyYXRlZCcsIAojICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiZmFjcyIsIHRpc3N1ZV9vZl9pbnRlcmVzdCwgIl9zZXVyYXRfdGlzcy5Sb2JqIikpCiMgbG9hZChmaWxlPWZpbGVuYW1lKQpgYGAKCiMgRXhwb3J0IHRoZSBmaW5hbCBtZXRhZGF0YQoKU28gdGhhdCBCaW9odWIgY2FuIGVhc2lseSBjb21iaW5lIGFsbCB5b3VyIGNlbGxfb250b2xvZ3lfY2xhc3NzLCBwbGVhc2UgZXhwb3J0IHRoZW0gYXMgYSBzaW1wbGUgY3N2LgoKYGBge3J9CmhlYWQodGlzc0BtZXRhLmRhdGEpCmBgYAoKYGBge3J9CmZpbGVuYW1lID0gaGVyZSgnMDBfZGF0YV9pbmdlc3QnLCAnMDNfdGlzc3VlX2Fubm90YXRpb25fY3N2JywgCiAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCh0aXNzdWVfb2ZfaW50ZXJlc3QsICJfZHJvcGxldCIsICJfYW5ub3RhdGlvbi5jc3YiKSkKd3JpdGUuY3N2KEZldGNoRGF0YSh0aXNzLCBjKCdwbGF0ZS5iYXJjb2RlJywnY2VsbF9vbnRvbG9neV9jbGFzcycsJ2NlbGxfb250b2xvZ3lfaWQnLCAnZnJlZV9hbm5vdGF0aW9uJywgJ3RTTkVfMScsICd0U05FXzInKSksIGZpbGU9ZmlsZW5hbWUpCmBgYAoKIyBGaWd1cmVzIGZvciBTdXBwbGVtZW50Cgo=